package config

import (
	"go.uber.org/zap"
	"gopkg.in/yaml.v3"
	"gorm.io/driver/mysql"
	"os"
	"time"
)

// ServerConfig 定义服务器配置结构体
type ServerConfig struct {
	NeedMockData                    bool                 `yaml:"need_mock_data"`                      // 是否需要模拟数据
	HttpAddr                        string               `yaml:"http_addr"`                           // HTTP 服务器监听地址
	HttpRequestGlobalTimeoutSeconds int                  `yaml:"http_request_global_timeout_seconds"` // HTTP 请求全局超时时间（秒）
	AlertManagerApi                 string               `yaml:"alert_manager_api"`                   // AlertManager API 地址
	MysqlC                          *mysql.Config        `yaml:"mysql"`                               // MySQL 配置，通过 gorm 的 mysql.Config 导入
	LogLevel                        string               `yaml:"log_level"`                           // 日志级别，例如 "debug", "info", "warn", "error"
	LogFilePath                     string               `yaml:"log_file_path"`                       // 日志文件路径
	SuperRoleName                   string               `yaml:"super_role_name"`                     // 超级管理员角色名称
	PublicCloudSyncC                *PublicCloudSync     `yaml:"public_cloud_sync"`                   // 公有云同步配置
	JWTC                            *JWT                 `yaml:"jwt"`                                 // JWT 配置
	ImDingDingC                     *ImDingDingConf      `yaml:"im_ding_ding"`                        // 钉钉配置
	WorkOrderAutoActionC            *WorkOrderAutoAction `yaml:"workorder_auto_action"`               // 工单自动执行模块配置
	GrpcServerConfigC               *GrpcServerConfig    `yaml:"grpc_server_config"`                  // gRPC 服务器配置
	JobExecC                        *ServerJobExec       `yaml:"job_exec"`                            // 任务执行配置
	K8sClusterC                     *K8sCluster          `yaml:"k8s_cluster"`                         // Kubernetes 集群配置
	MonitorComputeC                 *MonitorCompute      `yaml:"monitor_compute"`                     // 监控计算配置
	StreeCacheC                     *StreeCache          `yaml:"stree_cache"`                         // 服务树缓存配置
	Logger                          *zap.Logger          `yaml:"-"`                                   // 日志记录器（不从配置文件加载），用于日志记录
	Domain                          string               `yaml:"front_domain"`                        // 前端域名
	ImFeishuC                       *ImFeishu            `yaml:"im_feishu"`                           // 飞书配置
	LocalYamlDir                    string               `yaml:"local_yaml_dir"`                      // 本地 YAML 文件目录
	GitlabServerC                   *GitlabServer        `yaml:"gitlab_server"`                       // GitLab 服务器配置
}

// GitlabServer 定义 GitLab 服务器配置结构体
type GitlabServer struct {
	ApiAddr           string `yaml:"api_addr"`          // GitLab API 地址
	AdminToken        string `yaml:"admin_token"`       // GitLab 管理员访问令牌
	ApiTimeoutSeconds int    `yaml:"apiTimeoutSeconds"` // GitLab API 超时时间（秒）
}

// K8sCluster 定义 Kubernetes 集群配置结构体
type K8sCluster struct {
	Enable                     bool   `yaml:"enable"`                          // 是否启用 Kubernetes 集群功能
	RunIntervalSeconds         int    `yaml:"run_interval_seconds"`            // 运行间隔时间（秒）
	KubeConfigTempFileBasePath string `yaml:"kube_config_temp_file_base_path"` // KubeConfig 临时文件基路径
}

// ServerJobExec 定义任务执行配置结构体
type ServerJobExec struct {
	Enable             bool `yaml:"enable"`               // 是否启用任务执行模块
	RunIntervalSeconds int  `yaml:"run_interval_seconds"` // 运行间隔时间（秒）
	ExecTimeoutSeconds int  `yaml:"execTimeoutSeconds"`   // 执行超时时间（秒）
}

// MonitorCompute 定义监控计算配置结构体
type MonitorCompute struct {
	Enable             bool   `yaml:"enable"`               // 是否启用监控计算模块
	RunIntervalSeconds int    `yaml:"run_interval_seconds"` // 运行间隔时间（秒）
	ExecTimeoutSeconds int    `yaml:"execTimeoutSeconds"`   // 执行超时时间（秒）
	HttpSdApi          string `yaml:"httpSdApi"`            // HTTP 服务发现 API 地址
	AlertWebHookAddr   string `yaml:"alertWebHookAddr"`     // 警报 WebHook 地址
}

// StreeCache 定义服务树缓存配置结构体
type StreeCache struct {
	Enable             bool `yaml:"enable"`               // 是否启用服务树缓存模块
	RunIntervalSeconds int  `yaml:"run_interval_seconds"` // 运行间隔时间（秒）
}

// GrpcServerConfig 定义 gRPC 服务器配置结构体
type GrpcServerConfig struct {
	Addr string `yaml:"addr"` // gRPC 服务器监听地址
}

// ImDingDingConf 定义钉钉配置结构体
type ImDingDingConf struct {
	BotApiAddr string   `yaml:"bot_api_addr"` // 钉钉机器人 API 地址
	Title      string   `yaml:"title"`        // 消息标题
	AtMobiles  []string `yaml:"atMobiles"`    // @ 的手机号列表
}

// WorkOrderAutoAction 定义工单自动执行模块配置结构体
type WorkOrderAutoAction struct {
	Enable                   bool   `yaml:"enable"`                      // 是否启用工单自动执行模块
	ServiceAccount           string `yaml:"service_account"`             // 服务账号名称
	DetailUri                string `yaml:"detail_uri"`                  // 工单详情 URI
	RunIntervalSeconds       int    `yaml:"run_interval_seconds"`        // 运行间隔时间（秒）
	NotifyRunIntervalSeconds int    `yaml:"notify_run_interval_seconds"` // 通知运行间隔时间（秒）
	BatchNum                 int    `yaml:"batch_num"`                   // 批处理数量
	AutoTemplateNameBuyEcs   string `yaml:"auto_template_name_buyecs"`   // 自动购买 ECS 模板名称
	AutoTemplateNameRmEcs    string `yaml:"auto_template_name_rmecs"`    // 自动删除 ECS 模板名称
}

// PublicCloudSync 定义公有云同步配置结构体
type PublicCloudSync struct {
	Enable               bool        `yaml:"enable"`                  // 是否启用公有云同步模块
	RunIntervalSeconds   int         `yaml:"run_interval_seconds"`    // 运行间隔时间（秒）
	AliCloud             []*AliCloud `yaml:"ali_cloud"`               // 阿里云配置列表
	MockResourceFixedNum int         `yaml:"mock_resource_fixed_num"` // 模拟资源固定数量（用于测试）
	MockResourceRandNum  int         `yaml:"mock_resource_rand_num"`  // 模拟资源随机数量（用于测试）
}

// AliCloud 定义阿里云配置结构体
type AliCloud struct {
	Enable          bool   `yaml:"enable"`            // 是否启用阿里云
	RegionId        string `yaml:"region_id"`         // 阿里云区域 ID
	AccessKeyId     string `yaml:"access_key_id"`     // 阿里云访问密钥 ID
	AccessKeySecret string `yaml:"access_key_secret"` // 阿里云访问密钥 Secret
}

// LoadServer 从配置文件加载服务器配置
func LoadServer(filename string) (*ServerConfig, error) {
	cfg := &ServerConfig{}

	// 读取配置文件内容
	content, err := os.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	// 解析 YAML 配置
	err = yaml.Unmarshal(content, cfg)
	if err != nil {
		return nil, err
	}

	// 解析 JWT 配置中的过期时间和缓冲时间
	exd, err := time.ParseDuration(cfg.JWTC.ExpiresTime)
	if err != nil {
		return nil, err
	}

	bud, err := time.ParseDuration(cfg.JWTC.BufferTime)
	if err != nil {
		return nil, err
	}
	cfg.JWTC.ExpiresDuration = exd
	cfg.JWTC.BufferDuration = bud
	return cfg, err
}

// JWT 定义 JWT 配置结构体
type JWT struct {
	SigningKey      string        `yaml:"signing_key" json:"signing_key"`   // JWT 签名密钥
	ExpiresTime     string        `yaml:"expires_time" json:"expires_time"` // JWT 过期时间
	ExpiresDuration time.Duration `yaml:"-"`                                // 解析后的过期时间（不从配置文件加载）
	BufferTime      string        `yaml:"buffer_time" json:"buffer_time"`   // JWT 缓冲时间
	BufferDuration  time.Duration `yaml:"-"`                                // 解析后的缓冲时间（不从配置文件加载）
	Issuer          string        `yaml:"issuer" json:"issuer"`             // JWT 签发者
}
